package com.texaco.chapasFutbol.scene;

import org.andengine.entity.Entity;
import org.andengine.entity.IEntity;
import org.andengine.entity.scene.Scene;
import org.andengine.util.progress.IProgressListener;

import com.texaco.chapasFutbol.entidades.Game;

/**
 * Clase que implementará las funciones base de las
 * escenas que necesitemos.
 * @author texaco
 *
 */
public abstract class SceneBase extends Scene{

	protected Game game;
	protected boolean initiated = false;
	
	protected abstract void initAsync(final IProgressListener pProgressListener);
	protected abstract void update();
	
	/**
	 * Indica si la escena debe de ser cargada de forma asincrona, o sincrona.
	 * @return
	 */
	protected abstract boolean async();
	
	public SceneBase(Game game){
		super();
		this.game = game;
		iniLayers();
	}
	
	public void attachChild(int layer, IEntity entidad){
		this.getChildByIndex(layer).attachChild(entidad);
	}
	
	public boolean detachChild(int layer, IEntity entidad){
		return this.getChildByIndex(layer).detachChild(entidad);
	}
	
	public void init(final IProgressListener pProgressListener){
		initAsync(pProgressListener);
		initiated = true;
		update();
	}
	
	public boolean isInitiated(){
		return initiated;
	}
	
	/**
	 * Método que devuelve la cantidad de capas que tendrá la escena.
	 * Es necesario sobreescribirlo en cada escena para que se inicialicen 
	 * correctamente en el constructor.
	 * @return
	 */
	protected int layerCount(){
		return 0;
	}
	
	/**
	 * Inicializa las capas con valores vacios.
	 */
	private void iniLayers() {
		for (int i = 0; i < layerCount(); i++) {
			this.attachChild(new Entity());
		}		
	}
}
